const readline = require("readline");
const rl = readline.createInterface({
    input: process.stdin,
    output: process.stdout
});

let m; // 生命
let n; // 木板
let k; // 断裂数
let l = []; // 第几个断裂

rl.on("line", (line)=>{
    if(m === undefined) {
        let temp = line.trim().split(" ").map(Number);
        m = temp[0]
        n = temp[1]
        k = temp[2]
    } else {
        let temp = line.trim().split(" ").map(Number);
        l = l.concat(temp);
        getResult(m, n, k, l);
        // todo 收尾处理
        m = undefined;
        n = undefined;
        k = undefined;
        l.length = 0;
        rl.close();

    }

})

/**
 *
 * @param m 总生命树
 * @param n 木板树
 * @param k 断裂木板树
 * @param l 断裂位置
 */
function getResult(m, n, k, l) {
    //创建dp[i][j] 表示通过i个木板, 剩余j条生命的方案数
    // 起点和终点也算一个木板
    let dp = new Array(n + 2).fill(0).map(_ => new Array(m).fill(0))
    let bridge = new Array(n + 2).fill(0); // 桥的状态统计
    l.forEach((val)=>{
        bridge[val] = 1 // 断裂木板标记为1
    })
    // 初始化
    for(let i = 0; i <= m; i++) { // 理论上的起点(起点)
        if(i - bridge[0] >= 0) {
            dp[0][i] = 1;
        }
    }
    for(let i = 0; i <= m; i++) { // 理论上的终点(起点+终点)
        if(i - bridge[1] >= 0) {
            dp[1][i] = 1;
        }
    }
    for(let i = 0; i <= m; i++) { // 当只有一块木板时(起点+一块板+终点)
        if(i - bridge[2] >= 0) {
            dp[2][i] = dp[1][i] + 1;
        }
    }

    // 填充剩余数据
    for(let i = 3; i < n + 2; i++ ){
        for(let j = 0; j < m; j++) {
            if(bridge[i]) { // 木板断裂
                if(j !== 0) {
                    dp[i][j] = dp[i - 1][j - 1] + dp[i - 2][j - 1] + dp[i - 3][j - 1]
                }

            } else {
                dp[i][j] = dp[i - 1][j] + dp[i - 2][j] + dp[i - 3][j]
            }
        }
    }
    console.log("------>>>getResult", dp)
    // n + 1 表示到达终点, m - 1 表示剩余生命数
    console.log(dp[n + 1][m - 1])
}